home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
DTP
/
DTP_TEX
/
3239.ZIP
/
DVIMTP.ZIP
/
FONTSUB.H
< prev
next >
Wrap
Text File
|
1989-04-03
|
5KB
|
148 lines
/* -*-C-*- fontsub.c */
/*-->fontsub*/
/**********************************************************************/
/****************************** fontsub *******************************/
/**********************************************************************/
BOOLEAN
fontsub(subfont,submag,TeXfont,TeXmag)
char *subfont; /* new fontname returned */
int *submag; /* new magnification returned (0 if entire family) */
char *TeXfont; /* TeX requested fontname */
int TeXmag; /* TeX requested magnification value */
/***********************************************************************
Given a TeX fontname and a magnification value, search the font
substitution file (if any) for the first pattern defining a possible
replacement, and return their values in subfont[] and submag, with a
function value of TRUE. If no substitution is possible, subfont[] is
set to a null string, submag to 0, and the function value to FALSE.
The substitution file is searched for under the names
(1) subfile (by default, or from command line)
(2) subname subext
(3) subpath subname subext
allowing the user to have document-file specific substitutions, TeX-wide
private substitutions, and system TeX-wide substitutions. For example,
these files might be "sample.sub", "texfonts.sub", and
"texinputs:texfonts.sub" for a document "sample.tex".
Font substitution lines have the form:
% comment
oldname.oldmag -> subname.submag % comment
oldname oldmag -> subname submag % comment
oldname -> subname % comment
Examples are:
% These provide replacements for some LaTeX invisible fonts:
iamr10 1500 -> amr10 1500 % comment
iamr10.1500 -> amr10.1500 % comment
iamssb8 -> amssb8 % comment
These are easily readable by sscanf(). The first two forms request
substitution of a particular font and magnification. The third form
substitutes an entire font family; the closest available magnification
to the required one will be used. Any dots in the non-comment portion
will be converted to spaces, and therefore, cannot be part of a name
field.
The first matching substitution will be selected, so magnification-
specific substitutions should be given first, before family
substitutions.
Comments are introduced by percent and continue to end-of-line, just as
for TeX. One whitespace character is equivalent to any amount of
whitespace. Whitespace and comments are optional.
***********************************************************************/
{
static FILE* subfp = (FILE *)NULL; /* file pointer for sub file */
static BOOLEAN have_file = TRUE; /* memory of open success */
char line[MAXSTR]; /* for sub file lines */
char *pline; /* pointer to line[] */
static char fname[MAXFNAME]; /* sub file name */
char oldfont[MAXFNAME]; /* working storage for font names */
int oldmag; /* font magnification */
int k; /* sscanf() result */
int line_number; /* for error messages */
if (!have_file) /* no file available */
{
*subfont = '\0';
*submag = 0;
return (FALSE);
}
else if (subfp == (FILE *)NULL) /* happens only first time */
{
(void)strcpy(fname,subfile); /* try document specific: */
subfp = fopen(fname,"r"); /* e.g. foo.sub (from foo.dvi) */
DEBUG_OPEN(subfp,fname,"r");
if (subfp == (FILE *)NULL)
{
(void)strcpy(fname,subname);/* try path specific: */
(void)strcat(fname,subext); /* e.g. texfonts.sub */
subfp = fopen(fname,"r");
DEBUG_OPEN(subfp,fname,"r");
}
if (subfp == (FILE *)NULL)
{
(void)strcpy(fname,subpath);/* try system specific: */
(void)strcat(fname,subname);/* e.g. texinputs:texfonts.sub */
(void)strcat(fname,subext);
subfp = fopen(fname,"r");
DEBUG_OPEN(subfp,fname,"r");
}
if (subfp == (FILE *)NULL) /* could not open any substitution file */
{
have_file = FALSE;
*subfont = '\0';
*submag = 0;
return (FALSE);
}
}
line_number = 0;
(void)REWIND(subfp);
while (fgets(line,MAXSTR,subfp) != (char *)NULL)
{
line_number++; /* count lines */
pline = &line[0]; /* truncate at comment start or end-of-line */
while ((*pline) && (*pline != '%') &&
(*pline != '\r') && (*pline != '\n'))
{
if (*pline == '.') /* convert dots to whitespace for sscanf() */
*pline = ' ';
++pline;
}
*pline = '\0'; /* replace terminator by NUL */
if ((k = (int)sscanf(line," %s %d -> %s %d",oldfont,&oldmag,
subfont,submag)) == 4)
{
if ((TeXmag == oldmag) && (strcm2(oldfont,TeXfont) == 0))
return (TRUE);
}
else if ((k = (int)sscanf(line," %s -> %s",oldfont,subfont)) == 2)
{
*submag = 0;
if (strcm2(oldfont,TeXfont) == 0)
return (TRUE);
}
else if (k != EOF) /* EOF means no fields, so have empty line */
{
(void)sprintf(message,
"fontsub(): Bad font substitution at line %d in file \
[%s]: [%s]",
line_number,fname,line);
(void)warning(message);
}
}
*subfont = '\0';
*submag = 0;
return (FALSE);
}